<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 一、可选链式操作符 ；  ?
        // var obj = {
        //     name:"张三",
        //     hobby:{
        //         one:"篮球"
        //     }
        // }

        // console.log(obj?.hobby?.one);

        // 二 、空合并运算符 ； ??

        // function fn(a,b){
        //     // var a = a || 10;
        //     // var b = b || 20;

        //     var a = a ?? 10;
        //     var b = b ?? 20;
        //     console.log(a,b);
        // }

        // fn(1,"");


        // 三、迭代器 iterator 
        //1.Symbol.iterator 里
        // entries();
        var arr = ["张三","李四","王五"];
        // var obj = {name:"张三",age:20};
        // var map = new Map([['name',"张三"],["age",20]]);
        // console.log(map);
    //     console.log(arr);
    //     // 获取数据的迭代器 
    //     let iObj = arr[Symbol.iterator]();
    // //   console.log(iObj)
    //     // 任何迭代器 都会提供二个属性和一个方法 
    //     // 属性 是value done  方法是next() 执行下一步 
    //     console.log(iObj.next());
    //     console.log(iObj.next());
    //     console.log(iObj.next());
    //     console.log(iObj.next());


        //2. entries(); 里面是  键名和键值的集合 ；
            //  var obj = arr.entries();
            // console.log(obj.next());
            // console.log(obj.next());
            // console.log(obj.next());
            // console.log(obj.next());

        // 3.所有拥有迭代器的数据 都可以被 for  of 循环出来；
        
        // for(let key in arr)

        // val是键值 
        // for(let val of arr){
        //     console.log(val);
        // }

        // for of  循环 entries
        for(let [key,item] of arr.entries()){
            console.log(key,item);
        }




    </script>
</body>
</html>